package Negocio;

import java.util.*;

import javax.persistence.*;

import DTO.*;
import SRV.EncomiendaSRV;
import SRV.HojaDeRutaSRV;
import SRV.RemitoSRV;
import SRV.VehiculoSRV;

@Entity
@DiscriminatorValue("envioInterno")
public class EnvioInterno extends Envio
{
	
	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name="patente")
	private Vehiculo vehiculo;
	@OneToOne
	@JoinColumn(name="idHojaDeRuta")
	private HojaDeRuta hojaDeRuta;
	@Column (name="fechaSalida")
	private Date fechaSalida;
	@Column (name="fechaLlegada")
	private Date fechaLlegada;
	@OneToMany
	@JoinColumn(name="idRemito")
	private Collection<Remito> remitos;

	public EnvioInterno(String posicionActual, boolean habilitado, Vehiculo vehiculo, HojaDeRuta hojaDeRuta, Date fechaSalida, Date fechaLlegada) 
	{
		super(posicionActual, habilitado);
		this.vehiculo = vehiculo;
		this.hojaDeRuta = hojaDeRuta;
		this.fechaSalida = fechaSalida;
		this.fechaLlegada = fechaLlegada;
		this.remitos = new ArrayList<Remito>();
	}
	
	public EnvioInterno(){}
	
	public EnvioInterno toBusiness(EnvioInternoVO envioVO)
	{
	    Vehiculo vehiculo = new Vehiculo();
	    VehiculoSRV daoVeh =  new VehiculoSRV();
	    vehiculo = daoVeh.getVehiculo(envioVO.getVehiculo());
	    
	    HojaDeRuta hoja = new HojaDeRuta();
	    HojaDeRutaSRV daoHoj = new HojaDeRutaSRV();
	    hoja = daoHoj.getHojaDeRuta(envioVO.getHojaDeRuta());
	    
	    Remito remito = new Remito();
	    RemitoSRV daoRem = new RemitoSRV();
	    
	    Encomienda encomienda = new Encomienda();
	    EncomiendaSRV daoEnc = new EncomiendaSRV();
	    
	    EnvioInterno envio = new EnvioInterno(envioVO.getPosicionActual(), envioVO.isHabilitado(), vehiculo, hoja, envioVO.getFechaSalida(), envioVO.getFechaLlegada());
	    
	    for (int idRemito : envioVO.getRemitos())
	    {
	    	remito = daoRem.getRemito(idRemito);
	    	envio.agregarRemito(remito);
	    }
	    
	    for (int idEnc : envioVO.getEncomiendas())
	    {
	    	encomienda = daoEnc.getEncomienda(idEnc);
	    	envio.agregarEncomienda(encomienda);
	    }
	    return envio;
	}

	public Vehiculo getVehiculo() {
		return vehiculo;
	}

	public void setVehiculo(Vehiculo vehiculo) {
		this.vehiculo = vehiculo;
	}

	public HojaDeRuta getHojaDeRuta() 
	{
		return hojaDeRuta;
	}

	public void setHojaDeRuta(HojaDeRuta hojaDeRuta) {
		this.hojaDeRuta = hojaDeRuta;
	}

	public Date getFechaSalida() {
		return fechaSalida;
	}

	public void setFechaSalida(Date fechaSalida) {
		this.fechaSalida = fechaSalida;
	}

	public Date getFechaLlegada() {
		return fechaLlegada;
	}

	public void setFechaLlegada(Date fechaLlegada) {
		this.fechaLlegada = fechaLlegada;
	}


	public ArrayList<Remito> getRemitos() {
		return (ArrayList<Remito>)remitos;
	}

	public void setRemitos(ArrayList<Remito> remitos) {
		this.remitos = remitos;
	}
	
	public boolean tenesEsteRemito(Remito remito){
		for (Remito aux : remitos)
			if (aux.sosEsteRemito(remito.getIdRemito()))
				return true;
		return false;
	}
	
	public void agregarRemito(Remito remito){
		if  (!tenesEsteRemito(remito))
		    remitos.add(remito);
	}
	

	@Override
	public EnvioInternoVO toVO() {
	    ArrayList<Integer> remitosVO = new ArrayList<Integer>();
	    for (Remito remito : getRemitos())
	    	remitosVO.add(remito.getIdRemito());
	   
	    ArrayList<Integer> encomiendasVO = new ArrayList<Integer>();
	    for (Encomienda encomienda : getEncomiendas())
	    	encomiendasVO.add(encomienda.getIdEncomienda());
	    
	    EnvioInternoVO aux = new EnvioInternoVO(getIdEnvio(),getPosicionActual(),isHabilitado(), getVehiculo().getPatente(), getHojaDeRuta().getIdHojaDeRuta(),
	    		remitosVO, encomiendasVO, getFechaLlegada(), getFechaSalida());
	    return aux;
	}

	@Override
	public boolean sosEnvioUrgente() {
		return false;
	}

	@Override
	public boolean sosEnvioInternacional() {
		return false;
	}

	@Override
	public boolean sosEnvioInterno() {
		return true;
	}
}

